package bencode

import (
    "io"
    "errors"
)

// Implements io.ByteScanner over io.Reader, for use in Decoder, to ensure
// that as little as the undecoded input Reader is consumed as possible.
type scanner struct {
    r      io.Reader
    b      [1]byte // Buffer for ReadByte
    unread bool    // True if b has been unread, and so should be returned next
}

func (me *scanner) Read(b []byte) (int, error) {
    return me.r.Read(b)
}

func (me *scanner) ReadByte() (byte, error) {
    if me.unread {
        me.unread = false
        return me.b[0], nil
    }

    n, err := me.r.Read(me.b[:])
    if n == 1 {
        err = nil
    }

    return me.b[0], err
}

func (me *scanner) UnreadByte() error {
    if me.unread {
        return errors.New("byte already unread")
    }

    me.unread = true

    return nil
}
